package com.whxd.framework.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * <p><i>Copyright(c) 2008-2010 the original author or authors<br>
 * 
 * @version 1.0 (2008-8-25)
 * 
 * @author <a href="mailto:34205037@qq.com">王健</a>
 */
public class IdentityCard{
	
	/**
	 * 身份证有效性验证正则表达式,目前只验证是否是18位(允许最后一位为x-不区分大小写)或15位(旧身份证)长度的数字.
	 */
	public static final Pattern PATTERN = Pattern.compile("^(\\d{17,17}(\\d|x|X)|\\d{15,15})$");
	
	public static final String[] CN_SEX_REPLACEMENT = {"女","男"};
	
	/**
	 * 从身份证号码中取得出生日期
	 * @param cardCode 身份证号码
	 * @return 出生日期，以默认分隔符(-)进行分隔.
	 */
	public static String getBirthday(String cardCode){
		
		return getBirthday(cardCode,DateUtil.YEAR_MONTH_DAY_SEPARATOR);
	}
	
	/**
	 * 从身份证号码中取得出生日期
	 * @param cardCode 身份证号码
	 * @param separator 日期分隔符
	 * @return 出生日期，以指定分隔符进行分隔.
	 */
	public static String getBirthday(String cardCode,String separator){
		cardCode = StringUtil.allTrim(cardCode);
			
		int length = cardCode.length();
		int datePoint = 6,offset = 0;
		
		if (length == 18){
			offset = 2;
		}

		String year = (offset == 0 ? "19" : "") + cardCode.substring(datePoint,datePoint + 2 + offset);
		datePoint = datePoint + 2 + offset;
		
		String month = cardCode.substring(datePoint,datePoint + 2);
		datePoint = datePoint + 2;
		
		String day = cardCode.substring(datePoint,datePoint + 2);
		
		return String.format("%s%4$s%s%4$s%s",year,month,day,separator);
	}
	
	/**
	 * 验证身份证号码是否有效.
	 * @param cardCode 身份证号码.
	 * @return 有效返回true,否则返回false.
	 */
	public static boolean isValid(String cardCode){
		Matcher m = PATTERN.matcher(cardCode);
		return m.matches();
	}
	
	/**
	 * 从身份证号码中取得性别.
	 * @param cardCode 身份证号码.
	 * @return 女返回"0",男返回"1".
	 */
	public static String getSex(String cardCode){
		cardCode = StringUtil.allTrim(cardCode);
		int length = cardCode.length();
		int sex = Integer.valueOf(String.valueOf(length == 15 ? cardCode.charAt(14) : cardCode.charAt(16)));
		
		return String.valueOf(sex % 2);
	}
	
	/**
	 * 从身份证号码中取得性别(根据替换体进行性别编码的替换),
	 * 如果参数replacement为null或长度小于2,将不进行替换,
	 * 此方法依赖于getSex(String cardCode)的实现.
	 * @param cardCode 身份证号
	 * @param replacement 用来替换性别编码的替换体,替换单元顺序应该符合getSex(String cardCode)方法的返回顺序.
	 * @return 替换后的性别信息
	 */
	public static String getSex(String cardCode,String[] replacement){
		if (replacement == null || replacement.length < 2){
			return getSex(cardCode);
		}
		
		return replacement[Integer.valueOf(getSex(cardCode))];
	}
	
	public static int getAge(String cardCode){
		
		return 0;
	}
	
	public static void main(String[] args){

	}
}